import React, { Component, createRef } from 'react'

class App extends Component {

  state = {
    title: '标题',
    num: 10
  }

  numRef = createRef()

  add = () => {
    // 1. 调用setState会触发组件更新，执行render函数
    // 2. setState是异步的，无法立即获取到最新的state
    // 3. setState是批量更新的，会将多次setState合并成一次更新
    // 4. 调用setState时会把传入的参数和当前的state合并成一个新的state
    // 5. setState的第二个参数时一个回调函数，等待组件更新后执行
    // 6. setState第一个参数可以传入一个函数，函数的参数是最新的state，函数的返回值会合并到state中
    // 在react18之前，setState在setTimeout和原生事件中是同步的，在react18之后，setState在任何地方都是异步的

    setTimeout(() => {
      this.setState({ num: this.state.num + 1 })
      console.log(this.state.num)
      this.setState({ num: this.state.num + 1 })
      console.log(this.state.num)
      this.setState({ num: this.state.num + 1 })
      console.log(this.state.num)
    }, 0)


    // this.setState(prevState => {
    //   // prevState：最新的数据
    //   // return的对象会合并到state中
    //   console.log(prevState)
    //   return {
    //     num: prevState.num + 1
    //   }
    // })
    // this.setState(prevState => {
    //   console.log(prevState)
    //   return {
    //     num: prevState.num + 1
    //   }
    // })
    // this.setState(prevState => {
    //   console.log(prevState)
    //   return {
    //     num: prevState.num + 1
    //   }
    // })
    

    // this.setState({ num: this.state.num + 1 }, () => {
    //   // 等待组件更新后的回调函数，可以获取到最新的state和最新的dom元素
    //   console.log(this.state.num)
    //   console.log(this.numRef.current.outerHTML)
    // })


  }

  render() {
    console.log('render', this.state.num)
    const { num, title } = this.state
    return (
      <div>
        <h2>{title}</h2>
        <button onClick={this.add}>+</button>
        <p ref={this.numRef}>num: {num}</p>
      </div>
    )
  }
}

export default App
